home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekikoh Dennoh Club 2
/
Gekikoh Dennoh Club Vol. 2 (Japan).7z
/
Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin
/
tools
/
post2_g2
/
src
/
p_disp.c
< prev
next >
Wrap
Text File
|
1997-10-13
|
9KB
|
444 lines
/*
post / 郵便番号検索プログラム
p_disp.c / 表示部
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <sys/dos.h>
#include <mbstring.h>
#include "post.h"
/*
番号の表示
*/
void
disp_number()
{
uchar read_wk, /* ファイル読みワーク */
get_wk[256],
knum[8], /* 旧番号 */
kenmei[10], /* 県名 */
*get_wk_p;
int disp_kensuu = 0, /* 表示件数 */
i1 = 0, /* ループ汎用 */
loop_sw = 1; /* ループスイッチ */
int point[1024], /* 字名の ofs 位置 */
gen_page = 1, /* 今いるページ数 */
zen_page = 1, /* 全ページ数 */
lpcnt = 1, /* 表示行 */
ki = 0, /* 表示行(ループ用) */
lp = 1, /* ループ用 */
ofs_wk = 0, /* オフセット保存用 */
kijun = 0; /* 表示基準値 */
uchar numbuff[64],
page_azamei[PAGELINE][512], /* ページ用字名ワーク */
page_yomi3[PAGELINE][512], /* ページ用字名読みワーク */
pknum[PAGELINE][8], /* ページ用旧番号ワーク */
pnum[PAGELINE][12]; /* ページ用郵便番号ワーク */
struct _inpptr inpp;
/* 解析結果の表示 */
strcpy( kenmei, pref[num_pref] );
keta( kenmei, yomi0 );
keta( shikumei, yomi1 );
keta( shikumei2, yomi2 );
/* 読みがなの表示 */
printf("\t ");
kugiri();
printf("%s", yomi0 );
kugiri();
if( shikumei[0] != '\0' ) {
printf("%s", yomi1 );
kugiri();
}
if( shikumei2[0] != '\0' ) {
printf("%s", yomi2 );
kugiri();
}
printf("\n");
/* 地名の表示 */
printf("解析結果 : ");
kugiri();
printf("%s", kenmei );
kugiri();
if( shikumei[0] != '\0' ) {
printf("%s", shikumei );
kugiri();
}
if( shikumei2[0] != '\0' ) {
printf("%s", shikumei2 );
kugiri();
}
printf("\n\n");
get_wk[ 0 ] = '\0';
get_wk_p = get_wk;
if( buf[ofs] == '*' ) { /* いきなり番号なら */
ofs++;
get_next_num( get_wk_p ); /* 番号を得る */
number_seikei( get_wk_p );
ofs++;
get_next_num( knum ); /* 旧番号も */
if( buf[ofs] != '%' ) { /* 字名がない=一円 */
printf("%s%s", pref[num_pref], shikumei );
if( shikumei2[ 0 ] != '\0' ) { /* 市区名2で表示が異なる */
printf("%s",shikumei2 );
}
printf("内の郵便番号はすべて %s ", get_wk );
if( !k_suppress ) {
k_num_disp( knum );
printf(" ");
}
printf("です。\n");
return;
} else { /* 「以下に……」 */
printf("%s\t: 以下に掲載がない場合\n",get_wk );
}
}
disp_kensuu = 0;
while( loop_sw ) {
read_wk = buf[ ofs++ ];
get_wk[ 0 ] = '\0';
get_wk_p = get_wk;
switch( read_wk ) {
case '%': /* 町名字名 */
ofs_wk = ofs;
get_next_han( get_wk_p ); /* 字名を得る */
get_next_han2( yomi3 ); /* 字名の読みを得る */
if( input_str[0] == '\0' || /* 入力文がヌルか、 */
sentou_niji( get_wk ) ) { /* 先頭2字が一致 */
point[disp_kensuu] = ofs_wk;
disp_kensuu++;
pass_next_han();
pass_next_han();
} else {
pass_next_han();
pass_next_han(); /* 次の半角までパス */
}
break;
case '+': /* 読み */
puts("異常 202 : 読みを検出した");
break;
case ' ': /* 県 */
case '!': /* 市 */
case '$': /* 市内区 */
case '\"': /* 23区 */
case '#': /* 郡 */
case ':': /* 町 */
case ';': /* 村 */
loop_sw = 0; /* 処理終了 */
break;
default:
printf("read_wk=|%c|\n",read_wk);
printf("shikumei=|%s|,shikumei2=|%s|\n",shikumei,shikumei2);
printf("yomi0=|%s|,yomi1=|%s|,yomi2=|%s|,yomi3=|%s|\n",yomi0,yomi1,yomi2,yomi3);
puts("異常 201 : データファイル post.dat が異常です。");
exit( 1 );
break;
}
} /* while終端 */
if( disp_kensuu == 0 ) { /* ヒット1件もなし */
printf("\n警告 203 : 字名「%s」は検索できませんでした。\n", input_str );
printf("この字名は、通称であるか、入力間違いであるか、");
printf("元データの収録漏れの可能性があります。\n");
puts("読み検索などで再検索されることをお勧めします。");
} else { /* ヒットした */
gen_page = 1; /* 1ページ目から */
zen_page = disp_kensuu / PAGELINE + 1; /* 24件ずつ表示 */
if( zen_page == 0 ) {
zen_page = 1;
}
/* 桁揃え */
strcpy( kenmei, pref[num_pref] );
keta( kenmei, yomi0 );
keta( shikumei, yomi1 );
keta( shikumei2, yomi2 );
loop_sw = 1;
do {
_dos_c_cls_al();
status_print();
printf("該当件数 : %4d 件\t", disp_kensuu );
printf("ページ : %2d / %2d\n\n", gen_page, zen_page);
printf("\t ");
kugiri();
printf("%s", yomi0 );
kugiri();
if( shikumei[0] != '\0' ) {
printf("%s", yomi1 );
kugiri();
}
if( shikumei2[0] != '\0' ) {
printf("%s", yomi2 );
kugiri();
}
printf("\n");
printf("解析結果 : ");
kugiri();
printf("%s", kenmei );
kugiri();
if( shikumei[0] != '\0' ) {
printf("%s", shikumei );
kugiri();
}
if( shikumei2[0] != '\0' ) {
printf("%s", shikumei2 );
kugiri();
}
printf("\n\n");
/* 基準値 */
kijun = (gen_page - 1) * PAGELINE;
/* 実際に表示する件数 */
/* 1ページしかない、もしくは最終ページなら調整 */
if( gen_page == zen_page ) {
if( zen_page >= 2 ) {
lpcnt = disp_kensuu - ((zen_page-1)*PAGELINE);
} else {
lpcnt = disp_kensuu;
}
} else {
lpcnt = PAGELINE;
}
/* 初期化 */
for( i1=0; i1<=PAGELINE-1; i1++ ) {
page_azamei[i1][0] = '\0';
page_yomi3[i1][0] = '\0';
pnum[i1][0] = '\0';
}
/* データを取ってきて表示 */
for( i1=0; i1<=lpcnt-1; i1++ ) {
ki = kijun + i1;
ofs = point[ ki ];
/* 字名を得る */
get_next_han( page_azamei[i1] );
/* 50 字で打ち切り */
/*
if( strlen( page_azamei[i1] ) >= 50 ) {
page_azamei[i1][50]='\0';
strcat( page_azamei[i1], "〈略〉" );
}
*/
get_next_han2( page_yomi3[i1] ); /* 読み */
ofs++;
get_next_num( pnum[i1] );
number_seikei( pnum[i1] );
ofs++;
get_next_num( pknum[i1] );
/* ここから表示 */
printf("%4d : ", ki+1 ); /* 件数表示 */
if( !k_suppress ) {
k_num_disp( pknum[i1] ); /* 旧番号表示 */
}
printf("%s : ", pnum[i1] ); /* 新番号表示 */
if( input_str[0] == '\0' ) {
printf("%s", page_azamei[i1] );
} else {
moji_pr( page_azamei[i1], input_str );
}
printf("(%s)\n", page_yomi3[i1] );
}
/* キー入力 */
puts("");
printf("字名限定:a 旧番号切替:k 区切:d 厳密検索:g\n");
if( gen_page != zen_page ) {
printf("次ページ:n ");
}
if( gen_page != 1 ) {
printf("前ページ:b ");
}
printf("次検索:p 終了:q or e\n");
inpp.max = 64;
inpp.length = 64;
lp = 1;
do{
fep_off();
// _dos_kflushgs( &inpp );
_dos_gets( &inpp );
strcpy( numbuff, inpp.buffer );
if( numbuff[0] == 'q' || numbuff[0] == 'Q' ||
numbuff[0] == 'e' || numbuff[0] == 'E' ) {
puts("");
exit( 0 );
} else if( numbuff[0] == 'k' || numbuff[0] == 'K' ) {
/* 旧番号モードトグル */
if( k_suppress ) {
k_suppress = 0;
} else {
k_suppress = 1;
}
lp = 0;
} else if( numbuff[0] == 'a' || numbuff[0] == 'A' ) {
/* 字名モードトグル */
if( azamei_gentei ) {
azamei_gentei = 0;
} else {
azamei_gentei = 1;
}
lp = 0;
} else if( numbuff[0] == 'd' || numbuff[0] == 'D' ) {
/* 区切りモードトグル */
if( kugiri_mode ) {
kugiri_mode = 0;
} else {
kugiri_mode = 1;
}
lp = 0;
} else if( numbuff[0] == 'g' || numbuff[0] == 'G' ) {
/* 厳密モードトグル */
if( genmitsu_mode ) {
genmitsu_mode = 0;
} else {
genmitsu_mode = 1;
}
lp = 0;
} else if( numbuff[0] == 'p' || numbuff[0] == 'P' ) {
/* 次の検索へ */
lp = 0;
loop_sw = 0;
break;
} else if( numbuff[0] == 'n' || numbuff[0] == 'N' ||
numbuff[0] == '\0' ) {
/* 次のページへ */
if( gen_page != zen_page ) {
gen_page++;
lp = 0;
break;
}
} else if( numbuff[0] == 'b' || numbuff[0] == 'B' ) {
/* 前のページへ */
if( gen_page != 1 ) {
gen_page--;
lp = 0;
break;
}
}
/* 漢字かカナが入力された? */
if( ismbblead( numbuff[0] ) || /* 1文字はダメよ */
( ismbbkana( numbuff[0] ) && strlen( numbuff ) >= 2 ) ) {
dokuji_sw = 1;
exist_moji = 1;
strcpy( input_str, numbuff );
return;
}
/* 郵便番号か? */
if( is_bangou_legal( numbuff ) ) { /* 番号なら */
dokuji_sw = 1;
exist_moji = 1;
strcpy( input_str, numbuff ); /* 番号として検索 */
return;
}
} while ( lp );
} while( loop_sw );
}
return;
}
/*
旧番号表示
もらった文字列をフォームして表示
3桁: (nnn)
5桁:(nnn-nn)
*/
void
k_num_disp( uchar *kstr )
{
int kl, /* 長さ */
i1; /* ループ汎用 */
kl = strlen( kstr );
if( kl == 3 ) { /* 3桁である */
printf(" (%s)", kstr );
} else { /* 5桁である */
printf("(");
for( i1=0; i1<=2; i1++ ) {
printf("%c", kstr[i1] );
}
printf("-");
for( i1=3; i1<=4; i1++ ) {
printf("%c", kstr[i1] );
}
printf(")");
}
return;
}